package cn.tedu.order.tcc;
/*
订单的 TCC 操作接口
在接口上添加配置：
    1. @LocalTCC
    2. TCC三个方法
    3. 在第一阶段方法上，添加@TwoPhaseBusinessAction
    4. @TwoPhaseBusinessAction注解属性配置两个第二阶段方法
        - commitMethod="commit"
        - rollbackMethod="rollback"
    6. 三个方法都添加 BusinessActionContext 参数
    7. 在第一阶段方法上添加业务数据参数
    8. 需要向第二阶段传递的数据，添加 @BusinessActionContextParameter
       把数据放入上下文对象
 */

import io.seata.rm.tcc.api.BusinessActionContext;
import io.seata.rm.tcc.api.BusinessActionContextParameter;
import io.seata.rm.tcc.api.LocalTCC;
import io.seata.rm.tcc.api.TwoPhaseBusinessAction;

import java.math.BigDecimal;

@LocalTCC
public interface OrderTccAction {
    /*
    为了避开seata的一个bug，不传递封装的Order对象，
    而是把数据打散，一个一个地单独传递
     */
    @TwoPhaseBusinessAction(
            name = "OrderTccAction",
            commitMethod = "commit",        //默认
            rollbackMethod = "rollback"     //默认
    )
    boolean prepare(BusinessActionContext ctx,
                    @BusinessActionContextParameter(paramName = "orderId")
                    Long orderId,
                    Long userId,
                    Long productId,
                    Integer count,
                    BigDecimal money);

    boolean commit(BusinessActionContext ctx);

    boolean rollback(BusinessActionContext ctx);
}
